package com.itheima.api.generic.demo01;

import java.util.ArrayList;
import java.util.Collection;
import java.util.List;

/**
 * 演示： 泛型的好处
 */
public class GenericDemo01 {

    public static void main(String[] args) {

        // 1. 创建一个集合对象(Collection)
        // 之前我们创建集合对象的时候
        // 使用泛型，来明确集合中所存储的元素类型
        // Collection<String> col = new ArrayList<String>() ;

        // 不使用泛型
        // Collection  col = new ArrayList() ;

        // 使用泛型
        Collection<String>  col = new ArrayList<String>() ;

        /**
         * 不使用泛型，那么这个集合对象中我们可以添加什么数据呢？不使用泛型，那么默认的集合中的元素类型就是Object
         * 而我们的Object是所有的类的直接获取间接的父类，因此我们在进行元素添加的时候，可以去添加任意数据类型的元素
         */
        // 2. 添加元素
        col.add("hello") ;      // Object obj = "hello" ; 多态
        col.add("world") ;
        col.add("java") ;

        // 我们没有去使用泛型，默认集合中元素的类型就是Object，那么既然是Object我们就可以去添加任意的元素
        // col.add(23) ;           // ClassCastException: class java.lang.Integer cannot be cast to class java.lang.String
                                   // 错误是发生在运行时期


        // 添加元素
        // col.add(23) ;
        for(String s : col) {
            System.out.println(s.length());
        }

        // 3. 遍历集合
//        for(Object obj : col) {
//
//            // 我们需求：在控制台给我打印集合中每一个元素的长度？ 怎么搞
//            // 多态的弊端，就是不能去使用子类特有的功能，而length方法就是String中特有的方法 ， 因此就报错了；
//            // 解决思路：就是进行强转
//            // System.out.println(obj.length());
//            String s = (String)obj ;
//            System.out.println(s.length());
//        }

        /**
         * 我们发现不使用泛型，照样可以去使用集合，那么泛型的好处是啥呢？
         *
         * 我们需求：在控制台给我打印集合中每一个元素的长度？ 怎么搞
         *
         * 1. 把运行时期的错误提前到了编译期
         * 2. 提高了安全性
         * 3. 避免了强制类型转换
         *
         */

    }



}
